package cn.rumoss.nettytest.time;

import java.util.Date;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.ReferenceCountUtil;

/**
 * 构造一个内部的可积累的缓冲,直到4个字节全部接收到了内部缓冲
 * @author HeCG
 *
 */
public class TimeClientAllocHandler extends ChannelHandlerAdapter{
  
  private ByteBuf buf;
  
  /**
   * 每当从客户端收到新的数据时,这个方法会在收到消息时被调用
   */
  @Override
  public void channelRead(ChannelHandlerContext ctx,Object msg) throws Exception{
    
    // 一个引用计数对象,这个对象必须显示地调用release()方法来释放
    ByteBuf m = (ByteBuf)msg;
    buf.writeBytes(m);// 所有接收的数据都应该被累积在buf变量里
    m.release();
    
    if(buf.readableBytes() >= 4) {
      long currentTimeMillis = (buf.readUnsignedInt() - 2208988800L) * 1000L;
      System.out.println("客户端收到返回： " + currentTimeMillis);
      System.out.println(new Date(currentTimeMillis));
      ctx.close();
    }
    
  }
  
  @Override
  public void handlerAdded(ChannelHandlerContext ctx) throws Exception{
    buf = ctx.alloc().buffer(4);// 初始化
  }
  
  @Override
  public void handlerRemoved(ChannelHandlerContext ctx) throws Exception{
    buf.release();
    buf = null;
  }
  
  @Override
  public void exceptionCaught(ChannelHandlerContext ctx,Throwable cause) throws Exception{
    
    // 当异常发生的时候关闭连接
    cause.printStackTrace();
    ctx.close();
    
  }
  
}
